/// Shader.h
/// Matthew DiBernardo (Cryptex)
/// 07.28.09
///
/// Defines the Shader interface, which is used by the ShaderFactory and
/// ShaderManager to generically handle different types of shaders.

#ifndef _SHADER_H_
#define _SHADER_H_

#include <string>

class Shader
{
private:
	std::string m_headerName;

public:
	virtual ~Shader() {}
	
	// SetHeaderName()
	// -- Used to specify m_headerName, which is the name of the shader header
	// -- that the shader is loaded from.
	// Input: fileName - The shader header's filename.
	void SetHeaderName(std::string fileName) { m_headerName = fileName; }

	// GetHeaderName()
	// -- Accessor for m_headerName
	// Returns: m_headerName
	std::string GetHeaderName(void) { return m_headerName; }

	// BindShader()
	// -- Abstract function for binding the shader to the opengl render context.
	// -- This should be implemented as appropriate in derived classes.
	virtual void BindShader(void) = 0;

	// UnbindShader()
	// -- Abstract function for unbinding the shader from the opengl render context.
	// -- This should be implemented as appropriate in derived classes.
	virtual void UnbindShader(void) = 0;

	// BindPass()
	// -- Abstract function for binding the current pass to the opengl render context.
	// -- This should be implemented as appropriate in derived classes.
	// Input: _pass - The current pass number to be bound.
	virtual bool BindPass(unsigned int _pass) = 0;	
};

#endif